﻿/**
 * Classe relative à la page options.html
 */

/**
 * L'objet Options utilisé uniquement en mode "static"
 */
var Options = {};

/**
 * Le champ de texte du mot de passe
 */
Options.passwordFreeboxTextbox = null;
/**
 * Le bouton "sauvegarder"
 */
Options.saveButton = null;
/**
 * Le bouton "annuler"
 */
Options.resetButton = null;

/**
 * L'accès distant
 */
Options.distantAccess = {};

/**
 * La checkbox
 */
Options.distantAccess.cb = {};
/**
 * L'input IP
 */
Options.distantAccess.text_ip = null;
/**
 * L'input Port
 */
Options.distantAccess.text_port = null;

Options.torrentExceptions = {};

/**
 * Le bouton "ajouter" pour les exceptions torrents
 */
Options.torrentExceptions.addButton = null;
/**
 * Le champ de texte pour "ajouter" pour les exceptions torrents
 */
Options.torrentExceptions.addText = null;
/**
 * Le bouton "supprimer" pour les exceptions torrents
 */
Options.torrentExceptions.removeButton = null;
/**
 * La boîte de selection des exceptions torrents
 */
Options.torrentExceptions.selectExceptions = null;
/**
 * La combobox pour afficher le lien dans le menu contextuel
 */
Options.torrentExceptions.cbContextMenu = null;

/**
 * L'objet Storage
 */
var Storage;

/**
 * Raccourci pour document.getElementById
 *
 * @param {String} l'id à récupérer
 */
Options.$ = function(id)
{
	return document.getElementById(id);
};

/**
 * Vérifie les contrôles de tout ce qui concerne les exceptions torrents
 *
 * Met en disabled les boutons "Ajouter" et "Supprimer" si nécessaire
 */
Options.checkControlsTorrentExceptions = function()
{
	// Désactivé d'office
	Options.torrentExceptions.addButton.disabled = true;
	Options.torrentExceptions.removeButton.disabled = true;
	
	// Activation de "Supprimer" s'il y a au moins un élément sélectionné
	if (Options.torrentExceptions.selectExceptions.selectedIndex != -1)
		Options.torrentExceptions.removeButton.disabled = false;
		
	// Activation de "Ajouter" s'il y a un lien écrit dans le champ de texte (non vide, et n'ayant pas que "http://" et "https://")
	var txt = Options.torrentExceptions.addText.value;
	if (txt != "" && txt != "http://" && txt != "https://" && (txt.beginsWith("http://") || txt.beginsWith("https://")))
		Options.torrentExceptions.addButton.disabled = false;
};

/**
 * Initialisation de la page
 */
Options.init = function() {

	// Récupération de l'objet Storage
	Storage = chrome.extension.getBackgroundPage().Storage;
	
	// Récupération des divers contrôles de la page
	
	Options.passwordFreeboxTextbox = Options.$("password-freebox");
	Options.saveButton = Options.$("save-button");
	Options.resetButton = Options.$("reset-button");
	Options.torrentExceptions.addButton = Options.$("add-exceptions-torrent");
	Options.torrentExceptions.addText = Options.$("add-text-exceptions-torrent");
	Options.torrentExceptions.removeButton = Options.$("remove-exceptions-torrent");
	Options.torrentExceptions.selectExceptions = Options.$("slt-exceptions-torrent");
	Options.torrentExceptions.cbContextMenu = Options.$("cb-exceptions-torrent-context-menu");
  Options.distantAccess.cb = Options.$("distant-freebox");
  Options.distantAccess.text_ip = Options.$("ip-freebox");
  Options.distantAccess.text_port = Options.$("port-freebox");

	// Mises en place des évènements
	Options.passwordFreeboxTextbox.oninput = Options.markDirty;
	Options.saveButton.onclick = Options.save
	Options.resetButton.onclick = Options.cancel
	Options.torrentExceptions.cbContextMenu.onchange = Options.markDirty;
  Options.distantAccess.text_ip.oninput = Options.markDirty;
  Options.distantAccess.text_port.oninput = Options.markDirty;
	
	Options.torrentExceptions.addButton.onclick = Options.addExceptionTorrent;
	Options.torrentExceptions.removeButton.onclick = Options.removeExceptionTorrent;
	
	Options.torrentExceptions.addButton.disabled = true;
	Options.torrentExceptions.addText.oninput = Options.checkControlsTorrentExceptions;
	Options.torrentExceptions.selectExceptions.onchange = Options.checkControlsTorrentExceptions;
  Options.$("test-button").onclick = Options.onSaveDistantIP;
  Options.distantAccess.cb.onchange = Options.activationDistantAcces;
	
	Options.Permissions = chrome.extension.getBackgroundPage().Permissions;

	Options.setInputWithStorage();

	// Bouton sauvegarder disabled
	Options.markClean();
}

Options.setInputWithStorage = function()
{
	// Remplissage des différents éléments


	// D'abord la combobox
	var opt = Storage.get("exceptions-torrent-context-menu");

	if (opt && opt == "1")
		Options.torrentExceptions.cbContextMenu.checked = true;
	else if (opt && opt == "0")
		Options.torrentExceptions.cbContextMenu.checked = false;

	// Puis la liste des exceptions
	Options.torrentExceptions.selectExceptions.options.length = 0;
	
	var exceptions = TorrentExceptions.getAll();

	for (var i = 0; i < exceptions.length; i++)
	{
		var opt = new Option();
		opt.value = opt.text = exceptions[i];
		Options.torrentExceptions.selectExceptions.add(opt,null);
	}

  // L'accès distance freebox
  var accesDist = Storage.get("acces-distant-freebox") || false;
  if (accesDist == "1")
  {
    Options.distantAccess.cb.checked = true;
    var ip = Storage.get("acces-distant-freebox-ip") || ""
    var port = Storage.get("acces-distant-freebox-port") || "80"

    Options.distantAccess.text_ip.value = ip;
    Options.distantAccess.text_port.value = port;
  }
  else
    Options.distantAccess.cb.checked = false;

  Options.checkFieldsetDistantAcces();

	// Enfin la valeur du mot de passe
	Options.passwordFreeboxTextbox.value = Storage.get("password-freebox") || "";

	// Si on vient du lien "exclusion" dans le menu contextuel
	var params = URL.getParams();
	if (params.link)
	{
		Options.addExceptionTorrentFromExtern(decodeURIComponent(params.link));
	}

	// Vérification des contrôles des exceptions torrents
	Options.checkControlsTorrentExceptions();

}

/**
 * Ecouteur déclenché lorsque du clic sur le bouton "annuler" 
 */
Options.cancel = function()
{
	// On supprime tout les éléments du select des exceptions
	var slt = Options.torrentExceptions.selectExceptions;
	while (slt.options.length)
	{
		slt.remove(0);
	};
	
	// On re-initialise la page
	Options.init();
};


/**
 * Sauvegarde les paramètres utilisateurs
 */
Options.save = function() {

	// Sauvegarde du mot de passe Freebox
	Storage.set("password-freebox",Options.passwordFreeboxTextbox.value);

  // Sauvegarde de l'IP / Port
  if (Options.distantAccess.cb.checked)
  {
    Storage.set("acces-distant-freebox-ip",Options.distantAccess.text_ip.value);
    Storage.set("acces-distant-freebox-port",Options.distantAccess.text_port.value);
  }

	// Sauvegarde des exceptions
	
	// Tout d'abord, on les supprime toute
	TorrentExceptions.clean();
	
	var exceptions = [];
	var options = Options.torrentExceptions.selectExceptions.options;
	
	// Puis on les re-ajoute avec ce qu'il y a dans le select
	for (var i = 0; i < options.length; i++)
	{
		TorrentExceptions.add(options[i].value);
	}
	
	
	// Paramètre pour l'élément du menu contextuel "exclusion"
	if (Options.torrentExceptions.cbContextMenu.checked)
		Storage.set("exceptions-torrent-context-menu","1");
	else
		Storage.set("exceptions-torrent-context-menu","0");
	
	// Mise en place de l'élément du menu contextuel
	chrome.extension.getBackgroundPage().ContextMenu.update();
	
	// On vérifie les contrôles des exceptions torrents
	Options.checkControlsTorrentExceptions();
	
	// Disabled du bouton sauvegarder
	Options.markClean();
}

/**
 * Met le bouton sauvegarder en "enable"
 */
Options.markDirty = function() {
	Options.saveButton.disabled = false;
}

/**
 * Met le bouton sauvegarder en "disable"
 */
Options.markClean = function() {
  Options.setInputWithStorage();
	Options.saveButton.disabled = true;
}

/**
 * Ajoute une entrée à la liste des exclusions torrents
 *
 * Les exclusions valident commencent par "http://" ou "https://"
 */
Options.addExceptionTorrent = function()
{
	// On prend la valeur du champ de texte
	var text = Options.torrentExceptions.addText.value;
	
	// On ne prend en compte que les URL non vide
	if (text == "" || text == "http://" || text == "https://" || !(text.beginsWith("http://") || text.beginsWith("https://")))
		return;
	
	
	
	// Vérification si l'entrée n'existe pas
	var slt = Options.torrentExceptions.selectExceptions;
	
	var founded = false;
	for (var i = 0; i < slt.options.length; i++)
	{
		if (slt.options[i].value == text)
		{
			founded = true;
			break;
		}
	}
	
	// Si elle n'existe pas, on l'ajoute
	if (!founded)
	{
		var option = new Option();
		option.text = option.value = text;
		slt.add(option,null);
		// Sauvegarde possible
		Options.markDirty();
	}
	Options.torrentExceptions.addText.value = "http://";
		// Vérification des contrôles des exceptions torrents
	Options.checkControlsTorrentExceptions();
};

/**
 * Supprime les entrées sélectionnées de la liste des exclusions torrents
 */
Options.removeExceptionTorrent = function()
{
	var options = Options.torrentExceptions.selectExceptions.options;
	var removed = false;
	// Sélection multiple, donc on parcourt tous les éléments pour connaître ceux sélectionnés
	for (var i = 0; i < options.length; i++)
	{
		if (options[i].selected)
		{
			removed = true;
			// On la supprime
			Options.torrentExceptions.selectExceptions.remove(i);
			// On revient de 1 en arrière
			i--;
		}
	}
	// S'il y a suppression, la sauvegarde est possible
	if (removed)
	{
		Options.markDirty();
		// Vérification des contrôles des exceptions torrents
		Options.checkControlsTorrentExceptions();
	}
};

/**
 * Fonction appelée lorsque l'élément du menu contextuel "exclusion" a été cliqué
 */
Options.addExceptionTorrentFromExtern = function(url)
{
	// On met automatiquement la valeur du lien cliqué
	Options.torrentExceptions.addText.value = url;
	// On fait un focus dessus
	Options.torrentExceptions.addText.focus();
};

Options.addPermissionAll = function()
{
    chrome.permissions.request({origins: ['http://*/*']}, Options.addPermissionAllConfirmed );
}

Options.addPermissionAllConfirmed = function(bool)
{
    if (!bool)
        alert("Pour pouvoir utiliser l'accès distant, vous devez autoriser la permission à l'extension.")
      
    Options.distantAccess.cb.checked = bool;
    Options.checkFieldsetDistantAcces();
}

Options.onSaveDistantIP = function()
{
    if (!Options.Permissions.hasOrigin("http://*/*"))
    {
        alert("Pour pouvoir utiliser cette fonctionnalité, vous devez acceptez la permission qui va être demandé.");
        Options.addPermissionAll();
    }
}

Options.activationDistantAcces = function()
{
  if (this.checked && !Options.Permissions.hasOrigin("http://*/*"))
  {
    alert("Pour pouvoir utiliser cette fonctionnalité, vous devez acceptez la permission qui va être demandé.");
    Options.addPermissionAll();
  }
  else if (!this.checked)
  {
    Options.Permissions.removeOrigin("http://*/*")
    Options.checkFieldsetDistantAcces();
  }
  else
    Options.checkFieldsetDistantAcces();

}

Options.checkFieldsetDistantAcces = function()
{
  var accesDist = Options.$("distant-freebox").checked;
  var inputs = Options.$("fset-ip-freebox").getElementsByTagName("input");
  for (var i = 0; i < inputs.length; i++)
    inputs[i].disabled = !accesDist;
  if (accesDist)
    Options.$("fset-ip-freebox").className = ""
  else
    Options.$("fset-ip-freebox").className = "disabled"


  Storage.set("acces-distant-freebox",accesDist?"1":"0")
}

Options.init();
